package serial

import (
	"fmt"
	"time"
)

// Config 串口设备配置
type Config struct {
	// 基本串口参数
	Port        string        `json:"port"`         // 串口设备路径，如 /dev/ttyACM0
	BaudRate    int           `json:"baud_rate"`    // 波特率
	DataBits    int           `json:"data_bits"`    // 数据位 (5-8)
	StopBits    int           `json:"stop_bits"`    // 停止位 (1,2)
	Parity      string        `json:"parity"`       // 校验位 ("N","E","O")
	ReadTimeout time.Duration `json:"read_timeout"` // 读取超时

	// 协议相关参数
	MaxCommandLength  int           `json:"max_command_length"`  // 最大命令长度
	MaxResponseLength int           `json:"max_response_length"` // 最大响应长度
	CommandTimeout    time.Duration `json:"command_timeout"`     // 命令超时

	// 重连参数
	ReconnectInterval time.Duration `json:"reconnect_interval"`  // 重连间隔
	MaxReconnectTimes int           `json:"max_reconnect_times"` // 最大重连次数

	// 缓冲区大小
	ReadBufferSize  int `json:"read_buffer_size"`  // 读取缓冲区大小
	WriteBufferSize int `json:"write_buffer_size"` // 写入缓冲区大小

	// 调试选项
	EnableDebugLog bool `json:"enable_debug_log"` // 启用调试日志
}

// NewDefaultConfig 创建默认配置
func NewDefaultConfig() *Config {
	return &Config{
		Port:              "/dev/ttyACM0",
		BaudRate:          115200,
		DataBits:          8,
		StopBits:          1,
		Parity:            "N",
		ReadTimeout:       time.Second * 1,
		MaxCommandLength:  256,
		MaxResponseLength: 1024,
		CommandTimeout:    time.Second * 2,
		ReconnectInterval: time.Second * 5,
		MaxReconnectTimes: 3,
		ReadBufferSize:    1024,
		WriteBufferSize:   512,
		EnableDebugLog:    false,
	}
}

// Validate 验证配置参数
func (c *Config) Validate() error {
	if c.Port == "" {
		return fmt.Errorf("串口设备路径不能为空")
	}

	if c.BaudRate <= 0 {
		return fmt.Errorf("波特率必须大于0")
	}

	if c.DataBits < 5 || c.DataBits > 8 {
		return fmt.Errorf("数据位必须在5-8之间")
	}

	if c.StopBits != 1 && c.StopBits != 2 {
		return fmt.Errorf("停止位必须为1或2")
	}

	if c.Parity != "N" && c.Parity != "E" && c.Parity != "O" {
		return fmt.Errorf("校验位必须为N(无校验)、E(偶校验)或O(奇校验)")
	}

	if c.ReadTimeout <= 0 {
		return fmt.Errorf("读取超时必须大于0")
	}

	if c.CommandTimeout <= 0 {
		return fmt.Errorf("命令超时必须大于0")
	}

	if c.MaxCommandLength <= 0 {
		return fmt.Errorf("最大命令长度必须大于0")
	}

	if c.MaxResponseLength <= 0 {
		return fmt.Errorf("最大响应长度必须大于0")
	}

	if c.ReadBufferSize <= 0 {
		return fmt.Errorf("读取缓冲区大小必须大于0")
	}

	if c.WriteBufferSize <= 0 {
		return fmt.Errorf("写入缓冲区大小必须大于0")
	}

	return nil
}

// String 返回配置的字符串表示
func (c *Config) String() string {
	return fmt.Sprintf("Port:%s Baud:%d Data:%d Stop:%d Parity:%s",
		c.Port, c.BaudRate, c.DataBits, c.StopBits, c.Parity)
}
